# -*- coding = utf-8 -*-
import glob
from argparse import ArgumentParser
import os
import win32com
from win32com.client import Dispatch
import xlrd3

# 获取表格内容

class get_xls:
    def __init__(self, file):
        self.get = xlrd3.open_workbook(filename=file)
        self.sheet1 = self.get.sheet_by_index(0)
        print(f"当前共设置替换词库: {int(self.sheet1.nrows) - 1}")
        print(f"当前表单: {self.get.sheet_names()[0]}")

        self.nrows = int(self.sheet1.nrows) - 1
    def get_nrows(self):
        """
        获取词库行数
        :return: 返回词库行数(忽略表头)
        """
        return int(self.nrows)

    def get_data(self):
        """
        将词库做成词典
        :return:
        """
        data_list = {}
        for i in range(1, int(self.nrows) + 1):
            self.nco = self.sheet1.row(int(i))
            old = str(self.nco[2]).split(':')[1].replace("'", "")
            new = str(self.nco[3]).split(':')[1].replace("'", "")
            # print(f"第{i}个词库内容: {old} : {new}")
            data_list[old] = new
        print(data_list)
        return data_list


# 处理Word文档的类

class RemoteWord:
    def __init__(self, filename=None):
        self.xlApp = win32com.client.Dispatch('kwps.Application')  # 此处使用的是Dispatch，原文中使用的DispatchEx会报错
        if mode == 'word':
            self.xlApp = win32com.client.Dispatch('Word.Application')

        self.xlApp.Visible = 0  # 后台运行，不显示
        self.xlApp.DisplayAlerts = 0  # 不警告
        if filename:
            self.filename = filename
            if os.path.exists(self.filename):
                self.doc = self.xlApp.Documents.Open(filename)
            else:
                self.doc = self.xlApp.Documents.Add()  # 创建新的文档
                self.doc.SaveAs(filename)
        else:
            self.doc = self.xlApp.Documents.Add()
            self.filename = ''

    def add_doc_end(self, string):
        '''
        在文档末尾添加内容
        :param string:
        :return:
        '''
        rangee = self.doc.Range()
        rangee.InsertAfter('\n' + string)

    def add_doc_start(self, string):
        '''
        在文档开头添加内容
        :param string:
        :return:
        '''
        rangee = self.doc.Range(0, 0)
        rangee.InsertBefore(string + '\n')

    def insert_doc(self, insertPos, string):
        '''
        在文档insertPos位置添加内容
        :param insertPos:
        :param string:
        :return:
        '''
        rangee = self.doc.Range(0, insertPos)
        if (insertPos == 0):
            rangee.InsertAfter(string)
        else:
            rangee.InsertAfter('\n' + string)

    def replace_doc(self, string, new_string):
        '''
        替换文字
        :param string:
        :param new_string:
        :return:
        '''

        self.xlApp.Selection.Find.ClearFormatting()
        self.xlApp.Selection.Find.Replacement.ClearFormatting()
        # (string--搜索文本,
        # True--区分大小写,
        # True--完全匹配的单词，并非单词中的部分（全字匹配）,
        # True--使用通配符,
        # True--同音,
        # True--查找单词的各种形式,
        # True--向文档尾部搜索,
        # 1,
        # True--带格式的文本,
        # new_string--替换文本,
        # 2--替换个数（全部替换）
        self.xlApp.Selection.Find.Execute(string, False, False, False, False, False, True, 1, True, new_string, 2)

    def replace_docs(self, string, new_string):
        '''
        采用通配符匹配替换
        :param string:
        :param new_string:
        :return:
        '''
        self.xlApp.Selection.Find.ClearFormatting()
        self.xlApp.Selection.Find.Replacement.ClearFormatting()
        status = self.xlApp.Selection.Find.Execute(string, False, False, True, False, False, False, 1, False, new_string, 2)
        return status

    def save(self):
        '''保存文档'''
        self.doc.Save()

    def save_as(self, filename):
        '''文档另存为'''
        self.doc.SaveAs(filename)

    def close(self):
        '''保存文件、关闭文件'''
        self.save()
        self.xlApp.Documents.Close()
        self.xlApp.Quit()


def up(doc_file, data):
    doc = RemoteWord(doc_file)  # 初始化一个doc对象
    # 这里演示替换内容，其他功能自己按照上面类的功能按需使用
    sum = 0
    if data:
        for i in data:
            new = data[i]
            status = doc.replace_doc(string=str(i), new_string=str(new))  # 替换o为0
            sum = sum + 1
            print(f"当前文件:{doc_file}\n当前进度:\n完成第{sum} 个关键词替换: [{i}]->[{new}]")
        doc.close()
        return status
    else:
        print(f"变量未传入数据: data")

if __name__ == "__main__":
    all_info = ArgumentParser(description='设置使用参数-必须使用黑色的CMD程序，不要使用其他终端工具运行')
    all_info.add_argument('-p', '--path', type=str,
                          help="设置需要替换的文档存放的文件夹路径[必须]", default='./',
                          required=False)
    all_info.add_argument('-s', '--save', type=str, default=str('save'),
                          help="设置新文件保存路径[文件夹]-->暂时不调用", required=False)
    all_info.add_argument('-m', '--mode', type=str, default='wps',
                          help='设置程序调用的接口,可选参数: wps/word,默认使用wps(小写)', required=False)
    all_info.add_argument('-e', '--execl', type=str, default='word.xls',
                          help='指定一个关键词对照表的表格文件[必须]', required=True)
    all = all_info.parse_args()
    path = all.path
    save = all.save
    execl = all.execl
    modes = all.mode
    mode = 'wps'
    if str(modes) == 'word':
        mode = 'word'
    print(f"当前使用接口: {mode}")
    file_list = []
    if os.path.isfile(execl):
        print(f"本次任务词库文件: {execl}")
        get = get_xls(file=execl)
        data = get.get_data()
        if not os.path.isdir(save):
            os.mkdir(save)
            print(f"检测到未创建保存文件夹，现已自动创建: {save}")
        if path:
            if not os.path.isdir(path):
                exit(f'文件夹不存在: {path}')
            else:
                list = os.listdir(path=path)
                if list:
                    for i in list:
                        file_name = f"{path}\\{i}"
                        get_end_name = os.path.splitext(file_name)[-1]
                        if str(get_end_name) == '.doc' or str(get_end_name) == '.docx' or str(get_end_name) == '.wps':
                            print(f"已将文件添加至处理列表: {file_name}")
                            file_list.append(file_name)
                    for files in file_list:
                        status = up(doc_file=files, data=data)
                    print(f"任务结束")
        else:
            exit('未传入需要替换的文档所在文件夹路径')
    else:
        exit(f"未找到文件: {execl}")

